package main

import (
	"net/rpc"
	"net/rpc/jsonrpc"
)

//要求，服务端在注册rpc对象时能让编译器检测出，注册对象是否合法

// 创建接口，在接口中定义方法原型
type MyInterface interface {
	HelloWorld(string, *string) error
}

// 调用该方法时，需要给i传参，参数应该时 实现了HelloWorld 方法的类对象
func RegisterService(i MyInterface) {
	rpc.RegisterName("hello", i)
}

//---------------------------客户端
//向调用本地函数一样，调用远程函数

// 定义一个类
type MyClient struct {
	c *rpc.Client
}

// 由于使用了C调用call,一次需要初始化c
func InitClinet(addr string) MyClient {
	conn, _ := jsonrpc.Dial("tcp", addr)
	return MyClient{c: conn}
}

// 实现函数，原型参照上面的interface来实现
func (this *MyClient) HelloWorld(a string, b *string) error {
	//参数1，参照上面的Interface，RegisterName 而来，a:传入参数，b:传出参数.
	return this.c.Call("hello.HelloWorld", a, b)
}
